package com.xltx.qq.service;

import cn.hutool.json.JSONObject;
import com.xltx.qq.model.QqUserInfo;

/**
 * QqOAuth2Service
 *
 * @author 乐由
 * @since 2024/5/17 9:26
 */
public interface QqOAuth2Service {

    /**
     * authorize
     *
     * @return 返回授权地址
     */
    String authorize();


    /**
     * authorize 授权跳转到回调地址
     *
     * @param state client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
     * @return 返回授权地址
     */
    String authorize(String state);

    /**
     * authorize 授权跳转到回调地址
     *
     * @param state   client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
     * @param scope   例如：scope=get_user_info,list_album,upload_pic 不传则默认请求对接口get_user_info进行授权。
     * @param display 仅PC网站接入时使用。用于展示的样式。不传则默认展示为PC下的样式。 如果传入“mobile”，则展示为mobile端下的样式。
     * @return 返回授权地址
     */
    String authorize(String state, String scope, String display);

    /**
     * authorize 授权跳转到回调地址
     *
     * @param clientId    申请QQ登录成功后，分配给应用的appid。
     * @param redirectUri 成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
     * @param state       client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
     * @param scope       例如：scope=get_user_info,list_album,upload_pic 不传则默认请求对接口get_user_info进行授权。
     * @param display     仅PC网站接入时使用。用于展示的样式。不传则默认展示为PC下的样式。 如果传入“mobile”，则展示为mobile端下的样式。
     * @return 返回授权地址
     */
    String authorize(String clientId, String redirectUri, String state, String scope, String display);


    /**
     * 获取 accessToken
     *
     * @param code authorization code
     * @return access_token，expires_in，refresh_token
     */
    JSONObject accessToken(String code);

    /**
     * 获取 refresh_token
     * 自动续期
     *
     * @param refreshToken accessToken返回的refreshToken
     * @return access_token，expires_in，refresh_token
     */
    JSONObject refreshToken(String refreshToken);

    /**
     * 获取用户openId
     *
     * @param accessToken 获取到的accessToken
     * @return 用户openId
     */
    String acquireOpenId(String accessToken);

    /**
     * 获取用户信息
     *
     * @param accessToken 获取到的accessToken
     * @param openId      用户openId
     * @return 用户信息
     */
    QqUserInfo getUserInfo(String accessToken, String openId);
}
